package com.cssw.fyzb.core.dao.team;

import com.cssw.fyzb.core.model.dodb.User;
import com.cssw.fyzb.core.model.dodb.UserTree;
import com.cssw.fyzb.core.model.dodb.UserTreeH;
import com.ydn.dbframe.plugin.activerecord.Page;
import com.ydn.dbframe.plugin.activerecord.Record;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author Feng Chen
 */
public interface UserTreeDao {

    /**
     * 获取所有子元素
     *
     * @param supId
     * @return
     */
    List<User> getSuberBySupId(Long supId);


    /**
     * 获取所有的子元素不包含自己
     */
    Page<User> getAllSuberBySupArr(Map param, int page, int limit);

    Page<User> getSuberBySupArr(Map param, int page, int limit);

    /**
     * 获取子元素总数
     *
     * @param supId
     * @return
     */
    Integer countSuberBySupId(Long supId);

    /**
     * 团队人数统计
     *
     * @param supId
     * @return
     */
    Integer countTeamUserNumBySupId(Long supId);

    /**
     * 团队人数统计（只统计实名认证的用户）
     *
     * @param supId
     * @return
     */
    Integer countTeamAuthUserNumBySupId(Long supId);

    /**
     * 获取直接子元素总数
     *
     * @param supId
     * @return
     */
    Integer countDirectSuberBySupId(Long supId);

    /**
     * 获取子元素活跃度总和
     *
     * @param supId
     * @return
     */
    Integer sumDirectSuberActiveBySupId(Long supId);

    /**
     * 统计团队活跃度
     *
     * @param supId
     * @return
     */
    Integer sumTeamUserActiveBySupId(Long supId);

    /**
     * 获取有效直接子元素总数
     *
     * @param supId
     * @return
     */
    Integer countVDirectSuberBySupId(Long supId);

    /**
     * 获取有效直接子元素总数
     *
     * @param supId
     * @return
     */
    Integer countIDirectSuberBySupId(Long supId);


    /**
     * 获取所有父元素
     *
     * @param userId
     * @return
     */
    List<User> getSuperByUserId(Long userId);

    /**
     * 获取所有父元素
     *
     * @param userId
     * @return
     */
    Page<UserTree> pageBySupUserId(Long userId, int pageNum, int pageSize);


    /**
     * 获取所有父元素
     *
     * @param userId
     * @return
     */
    List<UserTree> getByUserId(Long userId);


    /**
     * 添加成员关系
     *
     * @param userId 新增的用户ID
     * @param supId
     * @param level
     * @return
     */
    void save(Long userId, Long supId, Integer level, Long mktUserId);

//    void saveUp(Long userId, Long supId, Integer level, Long mktUserId);

    void batchSave(List<UserTree> userTrees);

    /**
     * 查询用户 x代内等于或高于团队等级的x个市场数量
     *
     * @param userId
     * @param teamLevel
     * @param floorNum
     * @return
     */
    int listMktTeamNumByLevelFloor(Long userId, int teamLevel, int floorNum);

    /**
     * 统计团队贡献值
     *
     * @param userId
     * @return
     */
    Long sumTeamCredit(Long userId);

    /**
     * 统计用户全部市场及市场对应贡献值
     *
     * @param userId
     * @return
     */
    List<Record> listMktUserAndCount(Long userId);

    /**
     * 小区贡献值
     *
     * @return
     */
    Long sumTeamCreditMin(Long userId);

    Integer getTeamNum(Long userId);

    Integer getTeamChildNum(Long userId);

    /**
     * （邀请关系表）
     *
     * @return
     * @Param
     **/
    void cmfAgent(Long userId, Long supUserId);

    /**
     * 根据父级用户id删除3天没有观看视频的团队
     *
     * @return
     * @Param
     **/
    void deleteTree(Long userId);

    void addUserTree(Long userId, Long supUserId, Integer level, Date createTime);

    void batchUserTreeH(List<UserTreeH> userTreeHS);

    List<Record> listTeamForDate(Long userId, Date date);

    Integer countTaskTeamNum(Long userId, Date date);
}
